package service.impl;

import java.util.Objects;
import java.util.OptionalInt;
import java.util.concurrent.ThreadLocalRandom;

import dao.CustomDao;
import dao.impl.CustomDaoImpl;
import entity.Custom;
import service.CustomService;
import util.MD5Utils;
// 静态引入
import static util.MD5Utils.md5;

public class CustomServiceImpl implements CustomService {

	CustomDao dao = new CustomDaoImpl();
	
	@Override
	public boolean regist(Custom c) {
		// 1.来的c没有盐，盐是生成的随机字符串
		ThreadLocalRandom random = ThreadLocalRandom.current(); // 新的随机类
		int[] array = random.ints(2).toArray();
		String salt = "";
		for(int a : array) {
			salt += a;
		}
		c.setSalt(salt);
		// 2.来了c参数的密码是明文，最终写到数据库中的密码= md5(md5(明文的密码)+ md5(生成的盐))
		// 明文密码
		String mwpwd = c.getPwd();
		// 密码= md5(md5(明文的密码)+ md5(生成的盐))
		String md5pwd = md5(md5(mwpwd) + md5(salt));
		// 重新设置给用户（写入数据库的是加完密的密码）
		c.setPwd(md5pwd);
		
		// 调用dao的方法
		return dao.insert(c);
	}

	@Override
	public Custom login(String name, String pwd) {
		// 根据用户名在数据库里查询用户
		Custom c = dao.selectByName(name);
		if (Objects.isNull(c)) {
			return null;
		}else {
			// 得到此用户数据库的两层加密密码
			String dbpwd = c.getPwd();
			// 把参数的明文密码和实际盐再双层加密
			String md5pwd = md5(md5(pwd) + md5(c.getSalt()));
			// 两个密码相等才是登陆成功
			if (Objects.equals(dbpwd, md5pwd)) {
				// 更新登录状态为true
				return dao.updateStat(c,true) ? c : null;
			}else {
				return null;
			}
		}
	}
}
